﻿/*
  --============================================================================================
  --============================================================================================
  -- Fichier          :	WritePV.cs
  -- Objet			  :	Génére un fichier contenant la nouvelle version du PV qui sera intégré par la suite
  -- Auteur			  :	S. Le Gouellec
  -- Date de création : 07/2014
  --                              :
  --                              :
  -- Notes spéciales		  :
  -- Historique			  :
  ----------------------------------------------------------------------------------------------
  -- |     Code    |  Vers. |   Date   | Auteur	|                  Description
  -- |  Dem/inc/pr |  	    |          |        |         
  -- -------------------------------------------------------------------------------------------
  -- |             |   1.0  | 07/2014  |  SLE	| Création
  -- |	           |	    |	       |        |
  --============================================================================================
  --============================================================================================
*/

using ModelEntities.Adapter;
using ModelEntities.CompositionChimique;
using ModelEntities.Facade;
using ModelEntities.Tracabilite;
using Models.ExportPV;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
    /// <summary>
    /// Permet de générer et d'écrire dans un fichier le nouveau PV.
    /// </summary>
    public class WritePV
    {
        #region Attribut(s)

        private int nbappel = 0;
        #endregion

        #region Propriété(s)


        #endregion

        #region Constructeur(s)


        #endregion

        #region Méthode(s)

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pv"></param>
        /// <param name="cc"></param>
        /// <param name="traca"></param>
        /// <param name="pathFile"></param>
        public void Write(MEntetePV pv, CompositionChimiques cc, Traçabilites traca, String pathFile)
        {
            String separateur = ";";
            StringBuilder sb = new StringBuilder();

            // Met à jour les détails des compositions chimiques et des données de traçabilité (les deux grilles de données de l'application)
            MergeWithDataGridModification(pv, cc, traca);

            // Utilisation du Design Pattern Iterator pour générer le PV
            Iterateur it = new IterateurDetailPV(new ListeDetailsPV(pv.DetailsPV));

            while (!it.Finish())
            {
                StringBuilder line = new StringBuilder();

                MDetailsPV detail = (it.Next() as MDetailsPV);
                line.Append(detail.CodeInstruction).Append(separateur).Append(detail.NoLigne).Append(separateur).Append(detail.LibelleInstruction);

                sb.AppendLine(line.ToString());

                line.Clear();
            }

            ReadAndWrite.ReadAndWrite w = new ReadAndWrite.ReadAndWrite(pathFile);
            w.Write(sb.ToString());
        }

        //public void Write(MEntetePV pv, CompositionChimiques cc, Traçabilites traca, String pathFile)
        //{
        //    String separateur = ";";
        //    StringBuilder sb = new StringBuilder();

        //    // Met à jour les détails des compositions chimiques et des données de traçabilité (les deux grilles de données de l'application)
        //    MergeWithDataGridModification(pv, cc, traca);

        //    //Stockage dans une variable du nombre total de ligne
        //    int numlignelabo = 1, nbappel = 0;
        //    int nbligne = pv.DetailsPV.FindAll(details => details.CodeInstruction.Equals("DR01")).Count;
        //    String ligne = String.Empty;

        //    //Création d'un steamWriter pour ecriture dans un fichier
        //    using (StreamWriter sw = new StreamWriter(pathFile, false, System.Text.Encoding.Default))
        //    {
        //        while (numlignelabo != nbligne)
        //        {
        //            // si on a plus d'une page on ajoute la phrase ci dessous
        //            if (nbligne > 18 && nbappel > 1)
        //                sw.WriteLine("SP01;01;SAUT DE PAGE");

        //            foreach (PV_PARAMETRAGE param in FacadePV.Instance.GetParams())
        //            {
        //                ligne = Ecrire(pv, param, nbligne);
        //                if (ligne != null)
        //                    sw.WriteLine(ligne);
        //            }
        //            //Compteur pour indiquer le numéro de la page 
        //            nbappel += 1;
        //        }
        //    }
        //}

        #endregion

        #region Utils

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pv"></param>
        /// <param name="cc"></param>
        /// <param name="traca"></param>
        /// <returns></returns>
        private MEntetePV MergeWithDataGridModification(MEntetePV pv, CompositionChimiques cc, Traçabilites traca)
        {
            int compteur = 1;
            // Composition Chimique
            foreach (CompositionChimique compo in cc)
            {
                String compositionChimique = compo.TransformBack() as String;
                //pv.DetailsPV.Where(detail => detail.CodeInstruction.Equals("DC01") && Convert.ToInt32(detail.NoLigne) == compteur)
                //    .ToList<MDetailsPV>()
                //    .ForEach(detail => majDetail(detail, compositionChimique));
                pv.DetailsPV.Where(detail => detail.CodeInstruction.Equals("DC01") && Convert.ToInt32(detail.NoLigne) == compteur)
                    .ToList<MDetailsPV>()
                    .ForEach(detail => { detail.LibelleInstruction = compositionChimique; });
                ++compteur;
            }

            compteur = 1;

            // Tracabilité
            foreach (Traçabilite tr in traca)
            {
                String tracabilite = tr.TransformBack() as String;
                pv.DetailsPV.Where(detail => detail.CodeInstruction.Equals("DR01") && Convert.ToInt32(detail.NoLigne) == compteur)
                    .ToList<MDetailsPV>()
                    .ForEach(detail => majDetail(detail, tracabilite));
                ++compteur;
            }

            return pv;
        }

        private void majDetail(MDetailsPV obj, String compo)
        {
            obj.LibelleInstruction = compo;
        }

        //private string Ecrire(MEntetePV pv, PV_PARAMETRAGE param, int nbligne)

        //{
        //    #region déclaration de variables
        //    string j = DateTime.Now.Day.ToString().Length == 2 ? DateTime.Now.Day.ToString() : "0" + DateTime.Now.Day.ToString();
        //    string m = DateTime.Now.Month.ToString().Length == 2 ? DateTime.Now.Month.ToString() : "0" + DateTime.Now.Month.ToString();
        //    string a = DateTime.Now.Year.ToString().Substring(2);
        //    string date = j + m + a;
        //    string[] tabCorrespondance = new string[] {"V0","BIS","TER","QUA"};

        //    string ligne = String.Empty;
        //    #endregion

        //    try
        //    {
        //        //traite le code instruction si c'est la premiere page
        //        //Sinon si il doit apparaitre sur les autres pages
        //        if (param.TOP_MULTI_PAGE == "O" || nbappel == 1)
        //        {
        //            #region inscription du code instruction et du no de ligne
        //            if (param.NO_LIGNE == "00")
        //                ligne = param.CODE_INSTRUCTION + ";  ;";
        //            else
        //                ligne = param.CODE_INSTRUCTION + ";" + param.NO_LIGNE + ";";
        //            #endregion

        //            MDetailsPV detail = pv.DetailsPV.First(details =>
        //                        details.NoPV.Equals(pv.NoPV) &&
        //                        details.DateEdition.Equals(pv.DateEdition) &&
        //                        details.Version.Equals(pv.Version) && 
        //                        details.NoPage == 1 && 
        //                        details.CodeInstruction.Equals(param.CODE_INSTRUCTION) &&
        //                        details.NoLigne.Equals(param.NO_LIGNE == "00" ? "  " : param.NO_LIGNE)
        //                        );

        //            #region traitement da la version
        //            if (param.CODE_INSTRUCTION == "EB01")
        //                ligne += pv.NoPV + "      " + tabCorrespondance.ElementAt(tabCorrespondance.ToList().IndexOf(pv.Version) + 1);
        //            #endregion

        //            #region traitement da la version
        //            else if (param.CODE_INSTRUCTION == "STRE")
        //            {
        //                string lb1 = String.Empty;
        //                string lbl = String.Empty;
        //                lb1 = detail.LibelleInstruction.Substring(15, 6);
        //                lbl = detail.LibelleInstruction.Replace(
        //                            detail.LibelleInstruction.Substring(6, 2),
        //                            FacadePV.Instance.GetUser("ADMN").RESPONSABLE);

        //                lbl = lbl.Replace(lb1, date);

        //                ligne += lbl;
        //                return ligne;
        //            }
        //            #endregion

        //            #region traitement du laboratoire et de la compo chimique
        //            else if (param.CODE_INSTRUCTION == "DR01")
        //            {
        //                string l;
        //                l = param.INSTRUCTION_DEFAUT;
        //                //for (int i = 0; i < datagridLabo.Rows[Convert.ToInt32(param.NoLigne) - 1].Cells.Count; i++)
        //                //for (int i = 0; i < datagridLabo.Rows[numlignelabo - 1].Cells.Count; i++)
        //                //{
        //                //    try
        //                //    {
        //                //        if (i == 0)
        //                //            l = datagridLabo.Rows[numlignelabo - 1].Cells[i].Value.ToString().PadRight(Convert.ToInt32(ConfigurationManager.AppSettings[i.ToString() + "DR01"])) + ";";
        //                //        else
        //                //            l += datagridLabo.Rows[numlignelabo - 1].Cells[i].Value.ToString().PadRight(Convert.ToInt32(ConfigurationManager.AppSettings[i.ToString() + "DR01"])) + ";";
        //                //    }
        //                //    catch
        //                //    {
        //                //        return ligne += l;
        //                //    }
        //                //}
        //                ligne += l;
        //                //numlignelabo += 1;
        //                //nolabo = datagridLabo.Rows[numlignelabo - 1].Cells[12].Value.ToString();
        //            }
        //            else if (param.CODE_INSTRUCTION == "DE01")
        //            {
        //                ligne += detail.LibelleInstruction;
        //            }
        //            //#DEB# RVA le 30/08/2012 - Ref 20110021 - Gestion Nadcap Spectro sur PV
        //            else if (param.CODE_INSTRUCTION == "DN01")
        //            {
        //                ligne += detail.LibelleInstruction;
        //            }
        //            else if (param.CODE_INSTRUCTION == "DN02")
        //            {
        //                ligne += detail.LibelleInstruction;
        //            }
        //            //#FIN# RVA le 30/08/2012 - Ref 20110021 - Gestion Nadcap Spectro sur PV
        //            else if (param.CODE_INSTRUCTION == "DC01")
        //            {
        //                string li;
        //                li = param.INSTRUCTION_DEFAUT;
        //                //for (int i = 0; i < dataGridCompo.Rows[numlignecompo - 1].Cells.Count; i++)
        //                //{
        //                //    try
        //                //    {
        //                //        if (i == 0)
        //                //            //if (dataGridCompo.Rows[Convert.ToInt32(param.NoLigne) - 1].Cells[18].Value.ToString() == nolabo.ToString())
        //                //            li = dataGridCompo.Rows[numlignecompo - 1].Cells[i].Value.ToString().PadRight(Convert.ToInt32(ConfigurationManager.AppSettings[i.ToString() + "DC01"])) + ";";
        //                //        else
        //                //            li += dataGridCompo.Rows[numlignecompo - 1].Cells[i].Value.ToString().PadRight(Convert.ToInt32(ConfigurationManager.AppSettings[i.ToString() + "DC01"])) + ";";
        //                //    }
        //                //    catch
        //                //    {
        //                //        return ligne += li;
        //                //    }
        //                //}
        //                ligne += li + ";";
        //                //numlignecompo += 1;
        //            }
        //            #endregion

        //            #region Numéro page
        //            //numero de page
        //            else if (param.CODE_INSTRUCTION == "PH01")
        //            {
        //                ligne += "PAGE " + Convert.ToString(nbappel);
        //            }
        //            else if (param.CODE_INSTRUCTION == "PI01")
        //            {
        //                //#Debut# RVA gestion num page of 05/09/12
        //                /*if (numlignelabo == datagridLabo.Rows.Count - 17)
        //                    return ligne += "DERNIERE PAGE";
        //                    //#Debut# RVA derniere page pour saut de pages
        //                else if((datagridLabo.Rows.Count / nbappel)<17 )
        //                    return ligne += "DERNIERE PAGE";
        //                    //#Fin# RVA
        //                else
        //                    return ligne = null;*/
        //                //#DEB# FVE le 22/01/2014 - COR 20140050 - Problème de nombre de pages                            
        //                // Le nombre de ligne est récupérer à partir de la datagridlabo de l'écran
        //                // Sur l'écran nous avons toujours 1 ligne en plus par rapport à la table du coup on fait -1 pour le calcul
        //                //ligne += "of " + Math.Truncate((Convert.ToDouble(nbligne)/ 18)+1);
        //                ligne += "of " + Math.Truncate((Convert.ToDouble(nbligne - 1) / 18) + 1);
        //                //#FIN# FVE le 22/01/2014 - COR 20140050 - Problème de nombre de pages
        //                //#FIN# RVA gestion num page of 05/09/12
        //            }
        //            else if (param.CODE_INSTRUCTION == "PE01")
        //            {
        //                string jo = DateTime.Now.Day.ToString().Length == 2 ? DateTime.Now.Day.ToString() : "0" + DateTime.Now.Day.ToString();
        //                string mo = DateTime.Now.Month.ToString().Length == 2 ? DateTime.Now.Month.ToString() : "0" + DateTime.Now.Month.ToString();

        //                ligne += jo + "/" + mo + "/" + DateTime.Now.Year.ToString().Substring(2) + "   " + FacadePV.Instance.GetUser("ADMN").RESPONSABLE;
        //            }
        //            #endregion

        //            #region traitement generique des textbox
        //            else
        //            {
        //                //Traitement de tous les autres cas 
        //                //parcours générique des textbox
        //                if (param.TOP_VISUALISATION == "O")
        //                {

        //                    //Parcours du tabControl
        //                    //foreach (Control c in tabControl1.Controls)
        //                    //{
        //                    //    if (c.Name == param.NomChampAppli)
        //                    //        ligne += c.Text;

        //                    //    //Parcours des onglets
        //                    //    foreach (Control co in c.Controls)
        //                    //    {
        //                    //        if (co.Name == param.NomChampAppli)
        //                    //            ligne += co.Text;

        //                    //        //Parcours des GroupBox
        //                    //        foreach (Control con in co.Controls)
        //                    //        {
        //                    //            if (con.Name == param.NomChampAppli)
        //                    //                ligne += con.Text;
        //                    //        }
        //                    //    }
        //                    //}
        //                }
        //                else
        //                {
        //                    if (param.INSTRUCTION_DEFAUT != null && param.INSTRUCTION_DEFAUT != "")
        //                        ligne += param.INSTRUCTION_DEFAUT;
        //                    else
        //                        ligne += detail.LibelleInstruction;
        //                }
        //            }
        //            #endregion
        //            return ligne;
        //        }
        //        else
        //            ligne = null;
        //    }
        //    catch
        //    {
        //        ligne = null;
        //    }
        //    return ligne;
        //}


        #endregion
    }
}
